From a3bcc653ffc7bfc54148aa8279a462194dc958d4 Mon Sep 17 00:00:00 2001 From: "iap10@labyrinth.cl.cam.ac.uk" Date: Sat, 10 Jul 2004 22:50:09 +0000 Subject: [PATCH] bitkeeper revision 1.1062.1.5 (40f072a1UFyXtMJ6B61Hidr8z_FNGw) Fix block device name parsing to enable use of LVM/loopback devices. Also enable naming of devices by major minor e.g. 0x0306 --- tools/python/xen/xend/XendDomainInfo.py | 58 ++++++++++--------------- 1 file changed, 22 insertions(+), 36 deletions(-) diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 68724a63cc..629068e090 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -72,12 +72,12 @@ def blkdev_name_to_number(name): """Take the given textual block-device name (e.g., '/dev/sda1', 'hda') and return the device number used by the OS. """ - if not re.match( '/dev/', name ): + if not re.match( '^/dev/', name ): name = '/dev/' + name return os.stat(name).st_rdev -def lookup_raw_partn(partition): +def lookup_raw_partn(name): """Take the given block-device name (e.g., '/dev/sda1', 'hda') and return a dictionary { device, start_sector, nr_sectors, type } @@ -87,40 +87,26 @@ def lookup_raw_partn(partition): type: 'Disk' or identifying name for partition type """ - if not re.match( '/dev/', partition ): - partition = '/dev/' + partition - - """Try and match non-standard scsi raid arraysa - """ - if re.match( '/dev/cciss/c[0-9]+d[0-9]+p[0-9]+', partition ): - drive = re.split( 'p[0-9]+', partition )[0] + p = name + + if not re.match( '^/dev/', name ): + p = '/dev/' + name + + fd = os.popen( '/sbin/sfdisk -s ' + p + ' 2>/dev/null' ) + line = _readline(fd) + if line: + return [ { 'device' : blkdev_name_to_number(p), + 'start_sector' : long(0), + 'nr_sectors' : long(line) * 2, + 'type' : 'Disk' } ] else: - drive = re.split( '[0-9]', partition )[0] - - if drive == partition: - fd = os.popen( '/sbin/sfdisk -s ' + drive + ' 2>/dev/null' ) - line = _readline(fd) - if line: - return [ { 'device' : blkdev_name_to_number(drive), - 'start_sector' : long(0), - 'nr_sectors' : long(line) * 2, - 'type' : 'Disk' } ] - return None - - # determine position on disk - fd = os.popen( '/sbin/sfdisk -d ' + drive + ' 2>/dev/null' ) - - #['/dev/sda3 : start= 16948575, size=16836120, Id=83, bootable\012'] - lines = _readlines(fd) - for line in lines: - m = re.search( '^' + partition + '\s*: start=\s*([0-9]+), ' + - 'size=\s*([0-9]+), Id=\s*(\S+).*$', line) - if m: - return [ { 'device' : blkdev_name_to_number(drive), - 'start_sector' : long(m.group(1)), - 'nr_sectors' : long(m.group(2)), - 'type' : m.group(3) } ] - + # see if this is a hex device number + if re.match( '^(0x)?[0-9a-fA-F]+$', name ): + return [ { 'device' : string.atoi(name,16), + 'start_sector' : long(0), + 'nr_sectors' : long(1L<<63), + 'type' : 'Disk' } ] + return None def lookup_disk_uname(uname): @@ -143,7 +129,7 @@ def make_disk(dom, uname, dev, mode, recreate=0): """ segments = lookup_disk_uname(uname) if not segments: - raise VmError("vbd: Segments not found: uname=%s" % uname) + raise VmError("vbd: Segments not foundXXXXXX: uname=%s" % uname) if len(segments) > 1: raise VmError("vbd: Multi-segment vdisk: uname=%s" % uname) segment = segments[0] -- 2.30.2